﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SisVenda.Business;
using SisVenda.Data;
using System.Data;
using System.Collections;
using System.Reflection;
using Froggy.Data;


namespace SisVenda.Web.Restrito.Fn
{
    [System.ComponentModel.DataObject(true)]
    public class CadastroPessoaFisicaFn
    {
        private string cpf;
        private int end_id = 0, end_idUp = 0;
        public static DataTable dtRefPessoais;

        #region Select
        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
        public DataTable ObterClientecpf(string cpf)
        {
            #region SQL
            string sql = @" SELECT * FROM Pessoa
                           WHERE Pessoa.CPF = @cpf";

            #endregion
            DbCommandUtil db = new DbCommandUtil(sql);
            db.AddParameter("@cpf", DbType.String, cpf);
            return db.GetDataTable();
        }

        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
        public DataTable ObterEnderecoid(int idEndereco)
        {
            #region SQL
            string sql = @" SELECT * FROM Endereco
                           WHERE IdEndereco = @idEndereco ";

            #endregion
            DbCommandUtil db = new DbCommandUtil(sql);
            db.AddParameter("@idEndereco", DbType.Int32, idEndereco);
            return db.GetDataTable();
        }

        public DataTable obeterReferecias(int idPessoa)
        {

            #region SQL
            string sql = @" SELECT * FROM Referencia
                           WHERE Pessoa_IdPessoa = @idPessoa ";

            #endregion
            DbCommandUtil db = new DbCommandUtil(sql);
            db.AddParameter("@idPessoa", DbType.Int32, idPessoa);
            return db.GetDataTable();

        }

        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
        public DataTable ObterUF()
        {
            #region SQL
            string sql = @" SELECT * FROM Uf";

            #endregion
            DbCommandUtil db = new DbCommandUtil(sql);
            return db.GetDataTable();
        }

        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
        public DataTable ObterCidadeUF(string UfNome)
        {
            #region SQL
            string sql = @" SELECT * FROM Cidade
                            WHERE Uf_UfNome = @UfNome";

            #endregion
            DbCommandUtil db = new DbCommandUtil(sql);
            db.AddParameter("@UfNome", DbType.String, UfNome);
            return db.GetDataTable();
        }

        public string ObterUFCidade(int idCidade)
        {
            #region SQL
            string sql = @" SELECT Uf_UfNome FROM Cidade
                            WHERE IdCidade = @idCidade";

            #endregion
            DbCommandUtil db = new DbCommandUtil(sql);
            db.AddParameter("@idCidade", DbType.Int32, idCidade);
            return db.ExecuteScalar<string>();
        }

        public string obterCep(int idCidade)
        {
            #region SQL
            string sql = @" SELECT Cep FROM Cidade
                            WHERE IdCidade = @idCidade";

            #endregion
            DbCommandUtil db = new DbCommandUtil(sql);
            db.AddParameter("@idCidade", DbType.Int32, idCidade);
            return db.ExecuteScalar<string>();
        }
        #endregion

        public Boolean InsertPessoa(string nome, string cpf, string rg, string cnpj, string inscricaoEstadual, string sexo, string tipoPessoa, DateTime dataNascimento,
                                    string estadoCivil, string telefone, int idTipoTelefone, string celular, string fax, string email)
        {
            PessoaBo pessoas = new PessoaBo();
            Pessoa pessoa = new Pessoa();

            int id = 0;

            pessoa.Nome = nome;
            pessoa.CPF = cpf;
            pessoa.RG = rg;
            pessoa.CNPJ = cnpj;
            pessoa.InscricaoEstadual = inscricaoEstadual;
            pessoa.Sexo = sexo;
            pessoa.TipoPessoa = tipoPessoa;
            pessoa.DataNascimento = dataNascimento.Date;
            pessoa.EstadoCivil = estadoCivil;
            pessoa.TipoTelefone_IdTipoTelefone = idTipoTelefone;
            pessoa.Telefone = telefone;
            pessoa.Celular = celular;
            pessoa.Fax = fax;
            pessoa.Email = email;
            pessoa.Endereco_IdEndereco = end_id;


            pessoas.Add(pessoa);
            pessoa = null;
            try
            {
                pessoas.SaveChanges();
                if (tipoPessoa.Equals("F"))
                {
                    InsertCliente(id = obteridPessoaF(cpf));
                    InsertRefPessoais(id);
                }
                else
                {
                    InsertCliente(id = obteridPessoaJ(cnpj));
                    InsertRefPessoais(id);
                }
                pessoas = null;
                dtRefPessoais = null;
                return true;
            }
            catch { pessoas = null; dtRefPessoais = null; ;return false; }

        }


        public Boolean UpdatePessoa(string nome, string cpf, string rg, string cnpj, string inscricaoEstadual, string sexo, string tipoPessoa, DateTime dataNascimento,
                                    string estadoCivil, string telefone, string celular, string fax, string email, int idTipoTelefone)
        {
            PessoaBo pessoas = new PessoaBo();
            Pessoa pessoa = new Pessoa();
            int id = 0;

            pessoa = pessoas.Find(pes => pes.CPF == cpf).First<Pessoa>();

            pessoa.Nome = nome;
            pessoa.CPF = cpf;
            pessoa.RG = rg;
            pessoa.CNPJ = cnpj;
            pessoa.InscricaoEstadual = inscricaoEstadual;
            pessoa.Sexo = sexo;
            pessoa.TipoPessoa = tipoPessoa;
            pessoa.DataNascimento = dataNascimento.Date;
            pessoa.EstadoCivil = estadoCivil;
            pessoa.TipoTelefone_IdTipoTelefone = idTipoTelefone;
            pessoa.Telefone = telefone;
            pessoa.Celular = celular;
            pessoa.Fax = fax;
            pessoa.Email = email;



            pessoas.Update(pessoa);

            try
            {
                pessoas.SaveChanges();
                if (tipoPessoa.Equals("F"))
                {
                    UpdateCliente(id = obteridPessoaF(cpf));
                }
                else
                {
                    UpdateCliente(id = obteridPessoaJ(cnpj));
                }
                end_idUp = pessoa.Endereco_IdEndereco;
                pessoas = null;
                pessoa = null;
                return true;
            }
            catch { pessoa = null; pessoas = null; return false; }
        }

        public Boolean InsertEndereco(string descricao, string bairro, int numero, string cep, int idCidade)
        {
            EnderecoBo enderecos = new EnderecoBo();
            Endereco endereco = new Endereco();

            endereco.Descricao = descricao;
            endereco.Bairro = bairro;
            endereco.Numero = numero;
            endereco.Cep = cep;
            endereco.Cidade_IdCidade = idCidade;

            enderecos.Add(endereco);

            try
            {
                enderecos.SaveChanges();

                end_id = endereco.IdEndereco;
                endereco = null;
                enderecos = null;
                return true;

            }
            catch
            {
                endereco = null;
                enderecos = null;
                return false;
            }

        }

        public Boolean UpdateEndereco(string descricao, string bairro, int numero, string cep, int idCidade)
        {
            EnderecoBo enderecos = new EnderecoBo();
            Endereco endereco = new Endereco();

            endereco = enderecos.Find(end => end.IdEndereco == end_idUp).First<Endereco>();

            endereco.Descricao = descricao;
            endereco.Bairro = bairro;
            endereco.Numero = numero;
            endereco.Cep = cep;
            endereco.Cidade_IdCidade = idCidade;

            enderecos.Update(endereco);

            try
            {
                enderecos.SaveChanges();
                endereco = null;
                enderecos = null;
                return true;
            }
            catch
            {
                endereco = null;
                enderecos = null;
                return false;
            }

        }

        #region Obter id da tabela pessoa
        public int obteridPessoaF(string cpf)
        {
            PessoaBo pessoas = new PessoaBo();
            Pessoa pessoa = new Pessoa();

            pessoa = pessoas.Find(pes => pes.CPF == cpf).First<Pessoa>();
            int id = pessoa.IdPessoa;
            pessoa = null;
            pessoas = null;
            return id;
        }

        public int obteridPessoaJ(string cnpj)
        {
            PessoaBo pessoas = new PessoaBo();
            Pessoa pessoa = new Pessoa();

            pessoa = pessoas.Find(pes => pes.CNPJ == cnpj).First<Pessoa>();

            int id = pessoa.IdPessoa;
            pessoa = null;
            pessoas = null;
            return id;
        }
        #endregion

        public Boolean InsertCliente(int idPessoa)
        {

            Cliente cliente = new Cliente();
            ClienteBo clientes = new ClienteBo();
            cliente.Pessoa_IdPessoa = idPessoa;

            clientes.Add(cliente);
            cliente = null;
            try
            {
                clientes.SaveChanges();
                clientes = null;
                return true;
            }
            catch { clientes = null; return false; }

        }

        public Boolean UpdateCliente(int idPessoa)
        {

            Cliente cliente = new Cliente();
            ClienteBo clientes = new ClienteBo();
            cliente.Pessoa_IdPessoa = idPessoa;

            clientes.Update(cliente);
            cliente = null;
            try
            {
                clientes.SaveChanges();
                clientes = null;
                return true;
            }
            catch { clientes = null; return false; }

        }

        #region Armazenar Dados Temp Referencias Pessoas
        public void IniRefPessoais()
        {
            dtRefPessoais = new DataTable();
            dtRefPessoais.Clear();
            dtRefPessoais.Columns.Add("Descricao");
            dtRefPessoais.Columns.Add("Telefone");
        }

        public DataTable RefPessoais(string descricao, string telefone)
        {
            dtRefPessoais.Rows.Add(descricao, telefone);
            return dtRefPessoais;
        }

        #endregion

        public Boolean InsertRefPessoais(int pes_id)
        {
            ReferenciaBo referencias = new ReferenciaBo();
            Referencia referencia = new Referencia();
            int count = dtRefPessoais.Rows.Count;
            if (count != 1)
            {
                try
                {
                    for (int i = 0; i < count; i++)
                    {
                        referencia.Pessoa_IdPessoa = pes_id;
                        referencia.Descricao = dtRefPessoais.Rows[0]["Descricao"].ToString();
                        referencia.Telefone = dtRefPessoais.Rows[0]["Telefone"].ToString();

                        referencias.Add(referencia);

                        referencias.SaveChanges();
                    }
                    referencia = null;
                    referencias = null;
                    return true;
                }
                catch { return false; }
            }
            else { return false; }
        }

        public bool UpdateRefPessoais(int idReferencia, int idPessoa, string descricao, string telefone)
        {

            ReferenciaBo referencias = new ReferenciaBo();
            Referencia referencia = new Referencia();

            referencia = referencias.Find(refe => refe.IdReferencia == idReferencia).First<Referencia>();
            referencia.Descricao = descricao;
            referencia.Telefone = telefone;

            referencias.Update(referencia);
            try
            {
                referencias.SaveChanges();
                return true;
            }
            catch { return false; }
        }
    }
}